Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

制御構文の変更 #859

Draft
wants to merge 22 commits into
base: master
Choose a base branch
from
Draft

Conversation

takejohn
Copy link
Contributor

@takejohn takejohn commented Nov 20, 2024

What

unreleased/control-flow.md (#844 のunreleased/jump-statements.mdから名前変更)の追加内容

  • each, for, loop, do-while, while, return, break, continueは式になりました。
    • each式、for式、loop式、do-while式、while式の評価値はnullまたはbreakで返された値になります。
    • return式、break式、continue式は評価するとブロックから脱出するため、値はありません。
  • Breaking Change 内部に文や式を記述できる以下の構文に波括弧が必須になりました。
    • if式において、then節、elif節、else節
    • match式のcase節、default節の右辺において、文を指定する場合 (式を指定する場合、波括弧は不要)
    • each式、for式、loop式、do-while式、while式の処理内容
  • break式、continue式にラベルを付けて処理を中断するブロックを指定できるようになりました。
    • 処理を中断したいif式、match式、each式、for式、loop式、do-while式、while式にラベルをつけることができます。
    • break式、continue式に処理を中断したい式につけたラベルを指定することができます。
    • ラベルが指定されているbreak式およびcontinue式は同一ラベルが付与された式内にないとエラーになります。
    • if式、match式はbreak式で脱出された場合、その評価値はbreakで返された値になります。
    • if式、match式にcontinue式を用いることはできません。(ラベルを対応させると文法エラー)
  • break式に値を指定できるようになりました。
    • 指定された値は脱出した式の評価値になります。
    • 値を省略した場合、nullが指定されたものとみなします。
  • return式の値を省略できるようになりました。
    • 値を省略した場合、nullが指定されたものとみなします。

Why

Additional info (optional)

@codecov-commenter
Copy link

codecov-commenter commented Nov 20, 2024

⚠️ Please install the 'codecov app svg image' to ensure uploads and comments are reliably processed by Codecov.

Codecov Report

Attention: Patch coverage is 86.08059% with 76 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
src/node.ts 0.00% 61 Missing ⚠️
src/parser/plugins/validate-keyword.ts 58.33% 10 Missing ⚠️
src/parser/syntaxes/control-flow.ts 98.92% 3 Missing ⚠️
src/parser/plugins/validate-jump-statements.ts 94.87% 2 Missing ⚠️

❗ Your organization needs to install the Codecov GitHub app to enable full functionality.

Files with missing lines Coverage Δ
src/interpreter/control.ts 92.75% <100.00%> (ø)
src/interpreter/index.ts 95.64% <100.00%> (+9.83%) ⬆️
src/parser/index.ts 76.00% <100.00%> (-4.89%) ⬇️
src/parser/scanner.ts 94.52% <100.00%> (+5.75%) ⬆️
src/parser/syntaxes/expressions.ts 93.78% <100.00%> (+4.60%) ⬆️
src/parser/syntaxes/statements.ts 96.47% <ø> (+3.21%) ⬆️
src/parser/token.ts 100.00% <100.00%> (ø)
src/parser/visit.ts 100.00% <100.00%> (+5.26%) ⬆️
src/parser/plugins/validate-jump-statements.ts 97.26% <94.87%> (ø)
src/parser/syntaxes/control-flow.ts 98.92% <98.92%> (ø)
... and 2 more

... and 21 files with indirect coverage changes


🚨 Try these New Features:

test/jump-expressions.ts Outdated Show resolved Hide resolved
@salano-ym
Copy link
Member

breakにラベル付き式を渡すとラベル指定に判定が吸われて

Syntax: unexpected token: Colon

となって分かりにくいので、この書き方も許容するか個別のエラー文を出すかするといいかも(エラーにする方が安全?)。

#label1: loop {
    break #label2: loop {break #label1 0}
}

@takejohn
Copy link
Contributor Author

{の前にラベルを書く文法にすると
曖昧性なくbreakにラベル付き式を渡せそうだけどどうだろう

loop #label1 {
    break loop #label {break #label1 0}
}

@salano-ym
Copy link
Member

{の前にラベルを書く文法にすると
曖昧性なくbreakにラベル付き式を渡せそうだけどどうだろう

ラベル指定と区別できないから難しそう。

if break #label { 1 }

現状でもこの書き方は分かりにくいエラーに

#label: if break #label {
    1
}

@takejohn
Copy link
Contributor Author

{の前というかキーワードの後か

if #label1 break #label2 {}

まあややこしいね

@takejohn takejohn marked this pull request as draft November 24, 2024 12:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
3 participants